package com.swb.mybatis04emp.web.controller;

import com.swb.mybatis04emp.common.*;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;

/**
 * @title: BaseServlet
 * @author: 流沐颖
 * @date:2022/5/24 19:51
 * @description: 基础servlet 用来封装  调用子类方法和接受子类的方法值 实现转发或重定向
 * @version: study
 */
public class BaseServlet extends HttpServlet {
    /**
     * 重写父类的service方法
     *
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取前台传过来的method
        String method = request.getParameter("method");
        System.out.println(method);
        // 去子类中看是否有和method的值相同名字的方法

        // 得到类对象 是为了进行反射
        Class<? extends BaseServlet> aClass = this.getClass();


        try {
            //  通过类对象来对进行方法的反射  三个参数  分别为方法名  请求对象类型及响应对象类型-- 即 是方法的参数列表(形参)
            Method childMethod = aClass.getMethod(method, HttpServletRequest.class, HttpServletResponse.class);

            // 得到方法后则可以开始调用方法
            String invoke = (String) childMethod.invoke(this, request, response);

            // 若返回值中有forward操作  则将转发的地址截取出来
            if (invoke.startsWith(StaticConst.FORWARD)) {
                // 进行字符串的替换
                String path = invoke.replace(StaticConst.FORWARD, "");

                // 进行转发操作  request对象
                request.getRequestDispatcher(path).forward(request, response);
            } else if (invoke.startsWith(StaticConst.REDIRECT)) {
                // 进行字符串的替换
                String path = invoke.replace(StaticConst.REDIRECT, "");

                // 进行重定向操作的时候  记得要加入上下文路径  response对象
                response.sendRedirect(request.getContextPath() + "/" + path);

            } else {

                // 进行数据的写入 response对象
                response.getWriter().write(invoke);
            }


        } catch (Exception e) {
            e.printStackTrace();
            // 重定向到404页面 上下文对象

            response.sendRedirect(request.getContextPath() + "/404.jsp");
        }


    }
}
